// 第一题
// 请看下面已知条件实现foo函数
var foo = function(...ags){};// 要求实现函数体
var f1 = foo(1, 2, 3); f1.getValue(); // 6
var f2 = foo(1)(2, 3); f2.getValue();// 6
var f3 = foo(1)(2)(3)(4); f3.getValue();// 10

// 思路分析
// 1、foo函数传入多个参数
// 2、foo函数返回一个闭包函数，切在闭包作用域中存储每次传入的参数
// 3、 返回的闭包函数（对象）上有一个getValue的函数，进行计算逻辑

// 闭包的思路
var foo = function(...ags) {
    let paramsArr = [];
    paramsArr.push(...ags);
    function fn() {
        paramsArr = paramsArr.concat(Array.prototype.slice.call(arguments));
        console.log(paramsArr);
        return fn;
    };
    fn.getValue = function() {
        return paramsArr.reduce((pre, next) => pre + next, 0);
    };
    return fn;
}

// 和闭包同等功能特性的是类的静态成员
var foo2 = function(...args) {
    if(!Array.isArray(foo2.paramsArr)) {
        foo2.paramsArr = [];
    } else {
        foo2.paramsArr.push(...args);
    };
    return foo2;
};

Function.prototype.getValue = function() {
    return foo2.paramsArr.reduce((pre, next) => pre + next, 0);
};
